package br.com.esporte.view.site.grupo.comunidade.regra;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.wicket.Component;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.CompoundPropertyModel;

import br.com.base.exception.NegociosException;
import br.com.esporte.exception.ViewException;
import br.com.esporte.model.Grupo;
import br.com.esporte.model.Regra;
import br.com.esporte.model.TipoRegraEnum;
import br.com.esporte.view.infra.generic.IPaginaCadastro;
import br.com.esporte.view.infra.generic.Pagina;
import br.com.esporte.view.site.component.menu.menuTopo.MenuTopo;
import br.com.esporte.view.site.component.menu.menuTopo.MenuTopoComponente;
import br.com.esporte.view.site.grupo.comunidade.PaginaComunidade;

/**
 * 
 * @author Milton Domingues
 *
 */
public class PaginaCriarRegra extends PaginaComunidade implements IPaginaCadastro {

	private static final String LIST_MENUS_TOPO_ID = "menuTopo";

	private Regra regra;

	public PaginaCriarRegra(Grupo grupo) {
		super(grupo);
	}

	public PaginaCriarRegra(Grupo grupo, Regra regra) {
		this.regra = regra;
		setGrupo(grupo);
		montarPagina();
	}

	@Override
	public void acaoSalvar() {
		if(isUpdate()){
			getFachada().alterar(regra, getUsuarioLogado());
		}else{
			getFachada().inserir(regra, getUsuarioLogado());
		}
	}

	@Override
	public void carregarView() {
		super.carregarView();
		if(!isUpdate()){
			regra = new Regra();
			regra.setGrupo(getGrupo());
		}
		setDefaultModelEntity();
	}

	private Button criarBtSalvar() {
		Button botao = new Button("btSalvar"){
			private static final long serialVersionUID = -3960483125623050680L;
			@Override
			public void onSubmit() {
				try{
					acaoSalvar();
					setResponsePage(new PaginaListarRegra(getGrupo()));
					addInfo("Regra cadastrada com sucesso.");
				}catch (NegociosException e) {
					tratarException(e);
				}
			}
		};
		return botao;
	}

	private Form<Component> criarForm() {
		Form<Component> form = new Form<Component>("form");
		form.add(criarTipo());
		form.add(new TextField<String>("nome"));
		form.add(new TextArea<String>("descricao"));
		form.add(criarBtSalvar());
		return form;
	}

	private MenuTopoComponente criarMenuTopo(){
		return new MenuTopoComponente(LIST_MENUS_TOPO_ID, getMenusTopo(), getGrupo().getTipo());
	}

	private DropDownChoice<TipoRegraEnum> criarTipo(){
		ChoiceRenderer<TipoRegraEnum> choice = new ChoiceRenderer<TipoRegraEnum>("descricao");
		DropDownChoice<TipoRegraEnum> tipos = new DropDownChoice<TipoRegraEnum>("tipo", Arrays.asList(TipoRegraEnum.values()), choice);
		return tipos;
	}

	private List<MenuTopo> getMenusTopo(){
		List<MenuTopo> list = new ArrayList<MenuTopo>();

		Link<Pagina> event1 = new Link<Pagina>(MenuTopoComponente.LINK_MENU_ID) {

			private static final long serialVersionUID = 6408049973489553594L;

			@Override
			public void onClick() {
				try{
					setResponsePage(new PaginaListarRegra(getGrupo()));
				}catch (ViewException e) {
					redirectViewException(e);
				}
			}
		};
		list.add(new MenuTopo(event1, "Listar regras"));

		Link<Pagina> event2 = new Link<Pagina>(MenuTopoComponente.LINK_MENU_ID) {

			private static final long serialVersionUID = 6408049973489553594L;

			@Override
			public void onClick() {
				try{
					setResponsePage(new PaginaCriarRegra(getGrupo()));
				}catch (ViewException e) {
					redirectViewException(e);
				}
			}
		};
		list.add(new MenuTopo(event2, "Criar regras"));

		return list;
	}

	@Override
	public boolean isUpdate() {
		return (regra != null) && (regra.getId() != null);
	}

	@Override
	public void montarPagina() {
		super.montarPagina();
		addContainer(criarMenuTopo());
		addContainer(criarForm());
	}

	@Override
	public void setDefaultModelEntity() {
		setDefaultModel(new CompoundPropertyModel<Regra>(regra));
	}

	@Override
	public boolean viewPublica() {
		return false;
	}

}
